/**
 * createStream.js - 自定义可读流，将 a-z 输出到 process.stdout
 * 1) 定义 MyReadable，继承 stream.Readable
 * 2) 在 _read 中按需 push 字符，尊重背压；完成后 push(null)
 * 3) 使用 pipe 输出到标准输出
 */

const { Readable } = require('stream');

class MyReadable extends Readable {
  constructor(options = { encoding: 'utf8' }) {
    super(options);
    this.currentCharCode = 'a'.charCodeAt(0); // 97
    this.endCharCode = 'z'.charCodeAt(0);     // 122
  }

  _read() {
    // 按需推送，直到缓冲区满或数据结束
    while (this.currentCharCode <= this.endCharCode) {
      const chunk = String.fromCharCode(this.currentCharCode++);
      const canContinue = this.push(chunk);
      if (!canContinue) {
        // 背压：等待下一次 _read 触发再继续
        return;
      }
    }

    // 没有更多数据，推送 null 表示结束
    if (this.currentCharCode > this.endCharCode) {
      this.push(null);
    }
  }
}

// 实例化并输出到控制台
const myReadable = new MyReadable();
myReadable.pipe(process.stdout);

// 结束后补一个换行
myReadable.on('end', () => process.stdout.write('\n'));


